From: Keir Fraser Date: Mon, 15 Mar 2010 13:17:38 +0000 (+0000) Subject: x86: Fix possible S3 suspend hangs X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~12512 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=55120309eda0d3bfab572c78b187d57f68054d58;p=xen.git x86: Fix possible S3 suspend hangs It is possible for cpu to become offlined before irq disabled in idle loop, which will cause this cpu stay in C state and can't wakeup to play dead. Signed-off-by: Wei Gang Signed-off-by: Yu Ke --- diff --git a/xen/arch/x86/acpi/cpu_idle.c b/xen/arch/x86/acpi/cpu_idle.c index f06580fbb4..51227842e4 100644 --- a/xen/arch/x86/acpi/cpu_idle.c +++ b/xen/arch/x86/acpi/cpu_idle.c @@ -268,7 +268,8 @@ static void acpi_processor_idle(void) */ local_irq_disable(); - if ( softirq_pending(smp_processor_id()) ) + if ( softirq_pending(smp_processor_id()) || + cpu_is_offline(smp_processor_id()) ) { local_irq_enable(); sched_tick_resume(); diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index d20487f8d9..17f5c83c75 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -82,7 +82,8 @@ static void continue_nonidle_domain(struct vcpu *v) static void default_idle(void) { local_irq_disable(); - if ( !softirq_pending(smp_processor_id()) ) + if ( !softirq_pending(smp_processor_id()) && + cpu_online(smp_processor_id()) ) safe_halt(); else local_irq_enable();